﻿using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Infraestructura.Core.Contract.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Model.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Repository.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pe.Petecos.Comercial.Infraestructura.Repository.Implements.Ventas
{
    public class ProyectoRepository : QueryRepository, IProyectoRepository
    {
        public List<ProyectoLogic> Buscar(int codigoProyecto = 0, int codigoCliente = 0, string codigoEstado = "", string nombreCliente = "", string nombreProyecto = "", DateTime? fechaInicio = null, DateTime? fechaFin = null)
        {

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)codigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_CLIENTE", SqlDbType.Int) { Value = (object)codigoCliente ?? DBNull.Value },
                new SqlParameter("CODIGO_ESTADO_PROYECTO", SqlDbType.VarChar) { Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("NOMBRE_CLIENTE", SqlDbType.VarChar) { Value = (object)nombreCliente ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROYECTO", SqlDbType.VarChar) { Value = (object)nombreProyecto ?? DBNull.Value },
                new SqlParameter("FECHA_INICIO", SqlDbType.DateTime) { Value = (object)fechaInicio ?? DBNull.Value },
                new SqlParameter("FECHA_FIN", SqlDbType.DateTime) { Value = (object)fechaFin ?? DBNull.Value },
                new SqlParameter("PARAMETRO_ESTADO_PROYECTO", SqlDbType.Int) { Value = DatosConstantes.Parametro.EstadoProyecto },
                new SqlParameter("PARAMETRO_TIPO_PROYECTO", SqlDbType.Int) { Value = DatosConstantes.Parametro.TipoProyecto }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<ProyectoLogic>("VTA.USP_PROYECTO_SEL", parametros).ToList();
        }

        public int Modificar(ProyectoEntity proyecto)
        {
            var detalle = proyecto.ListaProyectoDetalle.Select(x => new
            {
                CODIGO_ARTICULO_PROVEEDOR = x.CodigoArticuloProveedor,
                CODIGO_ARTICULO = 0,
                CODIGO_PROVEEDOR = 0,
                NOMBRE_GRUPO = x.NombreGrupo,
                PRECIO_ARTICULO = x.PrecioArticulo,
                CANTIDAD = x.Cantidad,
                MONTO_TOTAL = x.MontoTotal
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {                
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)proyecto.CodigoProyecto ?? DBNull.Value },   
                new SqlParameter("OBSERVACIONES", SqlDbType.VarChar) { Value = (object)proyecto.Observaciones ?? DBNull.Value },   
                new SqlParameter("MONTO_SUBTOTAL", SqlDbType.Decimal){ Value = (object)proyecto.MontoSubTotal ?? DBNull.Value },
                new SqlParameter("MONTO_IGV", SqlDbType.Decimal){ Value = (object)proyecto.MontoIgv ?? DBNull.Value },
                new SqlParameter("MONTO_TOTAL", SqlDbType.Decimal){ Value = (object)proyecto.MontoTotal ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.NVarChar){ Value = (object)proyecto.UsuarioModificacion ?? DBNull.Value },
                new SqlParameter("LISTA_PROYECTO_DETALLE", SqlDbType.Structured) { Value = detalle.ToDataTable(), TypeName = "VTA.TYPE_LISTA_PROYECTO_DETALLE" }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_PROYECTO_UDP", parametros);
        }

        public int ModificarEstado(List<int> codigos, string codigoEstado, string usuario)
        {
            var lista = codigos.Select(x => new
            {
                CODIGO = x
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                
                new SqlParameter("LISTA_CODIGO", SqlDbType.Structured) { Value = lista.ToDataTable(), TypeName = "GRL.TYPE_LISTA_CODIGO" },
                new SqlParameter("CODIGO_ESTADO", SqlDbType.VarChar){ Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.VarChar){ Value = (object)usuario ?? DBNull.Value }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_PROYECTO_ESTADO_UDP", parametros);
        }

        public List<ProyectoDetalleLogic> BuscarDetalle(int codigoProyecto, int codigoProveedor = 0)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)codigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoProveedor ?? DBNull.Value }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<ProyectoDetalleLogic>("VTA.USP_PROYECTO_DETALLE_SEL", parametros).ToList();
        }

        public List<ProyectoDetalleLogic> BuscarDetalleXoc(int codigoProyecto, int codigoProveedor = 0)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)codigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoProveedor ?? DBNull.Value }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<ProyectoDetalleLogic>("VTA.USP_PROYECTO_DETALLE_SEL_POR_OC", parametros).ToList();
        }

        public List<ProyectoDetalleLogic> ValidarItemsProyecto(int codigoProyecto, int codigoArticuloProveedor = 0)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)codigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_ARTICULO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoArticuloProveedor ?? DBNull.Value }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<ProyectoDetalleLogic>("VTA.USP_PROYECTO_DETALLE_VAL", parametros).ToList();
        }
    }
}
